// type F1 = (a: number) => void
// type F2 = (a: number, b: number) => void

// let f1: F1 = (a: number) => {
//   console.log(a)
// }

// let f2: F2 = (a: number, b: number) => {
//   console.log(a, b)
// }

// f2 = f1 // f2兼容f1， 这是因为f2比f1多一个参数b，而通常函数的参数个数是兼容的
// f1 = f2
class Point2D {
  x: number = 1
  y: number = 2
}

class Point3D {
  x: number = 1
  y: number = 2
  z: number = 3
}

type F1 = (p: Point2D) => void
type F2 = (p: Point3D) => void
let f1: F1 = (p: Point2D) => {
  console.log(p)
}
let f2: F2
// f1 = f2
// 接口作为参数时，可以拆开来看属性个数，属性个数少的等价于参数少
f2 = f1 // f2兼容f1， 这是因为f2比f1多一个参数z，而通常函数的参数个数是兼容的